package arithmetic.leecode_arthmetic;

/**
 * 反转链表二
 * describe:给你单链表的头指针 head 和两个整数 left 和 right ，其中 left <= right 。
 * 请你反转从位置 left 到位置 right 的链表节点，返回 反转后的链表 。
 * url:<a href="https://leetcode.cn/problems/reverse-linked-list-ii/description/?envType=study-plan-v2&envId=top-interview-150"></a>
 */
public class Solution92 {
    /**
     * 基于迭代反转
     * @param head:链表
     * @param left:需要反转的开始位置
     * @param right:需要反转的结束位置
     * @return：链表
     */
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode listNode = new ListNode(0);
        listNode.next = head;
        ListNode preNode = listNode;
        //移动preNode节点位置 preNode.next 就是要开始移动的起点
        for(int i = 0;i<left -1 ; i++){
            preNode = preNode.next;
        }
        //开始移动的起点
        ListNode startNode = preNode.next;
        //
        ListNode nextNode = startNode.next;

        for(int i = 0;i<right - left;i++){
            startNode.next = nextNode.next;
            nextNode.next = preNode.next;
            preNode.next = nextNode;
            nextNode =  startNode.next;
        }
        return listNode.next;
    }


    private class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
}
